import random
import uuid  # 修改点1：添加导入 uuid 模块
from datetime import datetime  # 修改点2：添加导入 datetime 模块

# 定义可用的类型和状态选项
BOOK_GENRES = ["小说", "科幻", "历史", "传记", "哲学", "经济", "计算机", "心理学", "其他"]
MOVIE_GENRES = ["动作", "喜剧", "科幻", "恐怖", "爱情", "悬疑", "纪录片", "动画", "其他"]
STATUS_OPTIONS = ["未开始", "进行中", "已完成"]


def get_media_details_input(media_type):
    """根据媒体类型获取用户输入的媒体详细信息，并返回格式化的记录字典"""
    if media_type not in ["book", "movie"]:
        raise ValueError("媒体类型必须是 'book' 或 'movie'")

    # 获取基本信息
    title = input("请输入标题: ").strip()
    if media_type == "book":
        creator = input("请输入作者: ").strip()
        genres = BOOK_GENRES
        creator_label = "author"  # 修改点3：将作者字段名改为 "author"
    else:
        creator = input("请输入导演: ").strip()
        genres = MOVIE_GENRES
        creator_label = "director"  # 修改点4：将导演字段名改为 "director"

    # 验证并获取类型
    while True:
        print(f"请选择类型: {', '.join([f'{i + 1}.{g}' for i, g in enumerate(genres)])}")
        genre_choice = input(f"请选择类型 (输入序号1-{len(genres)}): ").strip()
        try:
            genre_index = int(genre_choice) - 1
            if 0 <= genre_index < len(genres):
                genre = genres[genre_index]
                break
            else:
                print("输入的序号超出范围，请重新输入。")
        except ValueError:
            print("请输入有效的数字序号。")

    # 验证并获取状态
    while True:
        print(f"可用的状态选项: {', '.join([f'{i + 1}.{s}' for i, s in enumerate(STATUS_OPTIONS)])}")
        status_choice = input("请选择状态 (输入序号1-3): ").strip()
        try:
            status_index = int(status_choice) - 1
            if 0 <= status_index < len(STATUS_OPTIONS):
                status = STATUS_OPTIONS[status_index]
                break
            else:
                print("输入的序号超出范围，请重新输入。")
        except ValueError:
            print("请输入有效的数字序号。")

    # 验证并获取评分
    while True:
        rating_input = input("请输入评分 (1-5): ").strip()
        try:
            rating = float(rating_input)
            if 1 <= rating <= 5:
                break
            else:
                print("评分必须在1到5之间，请重新输入。")
        except ValueError:
            print("请输入有效的数字评分。")

    # 获取简评
    review = input("请输入简评 (可选，直接回车跳过): ").strip()

    # 生成唯一ID和添加日期
    item_id = str(uuid.uuid4())
    added_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # 构建并返回记录字典
    return {
        "id": item_id,
        "type": media_type,
        "title": title,
        creator_label: creator,  # 修改点5：使用 creator_label 作为字段名
        "genre": genre,
        "status": status,
        "rating": rating,
        "review": review if review else None,
        "added_date": added_date
    }


def add_new_media_interaction():
    """处理添加新媒体的交互流程，返回用户创建的媒体记录"""
    while True:
        print("\n请选择要添加的媒体类型:")
        print("1. 书籍")
        print("2. 影视")
        choice = input("请选择 (输入序号1-2，或输入q退出): ").strip().lower()

        if choice == 'q':
            print("已取消添加操作。")
            return None
        elif choice == '1':
            return get_media_details_input("book")
        elif choice == '2':
            return get_media_details_input("movie")
        else:
            print("无效的选择，请重新输入。")


def format_media_item_for_display(item_dict, display_type="summary"):
    """
    格式化书/影记录为显示字符串
    :param item_dict: 媒体条目字典
    :param display_type: "summary" 简略模式 / "full" 完整模式
    :return: 格式化后的字符串
    """

    if not item_dict:
        return "无效的媒体条目"

    # 公共字段处理
    title = item_dict.get('title', '无标题')
    media_type = item_dict.get('type', '未知类型')

    if display_type == "summary":
        # 简略模式: ID. 标题 (类型) - 状态
        status = item_dict.get('status', '未知状态')
        return f"{item_dict.get('id', '?')}. {title} ({media_type}) - {status}"

    else:  # full mode
        # 修改点6：根据媒体类型获取对应的作者/导演字段
        author_director = item_dict.get('author', '未知作者') if media_type == 'book' else item_dict.get('director', '未知导演')
        added_date = item_dict.get('added_date', '未知添加日期')
        status = item_dict.get('status', '未知状态')
        rating = item_dict.get('rating', '未评分')
        if rating and rating != 0:
            rating_str = f"{rating}/5"
        else:
            rating_str = "未评分"

        review = item_dict.get('review', '无简评')
        if review == '':
            review = '无简评'

        lines = [
            f"{'=' * 40}",
            f"标题: {title}",
            f"类型: {media_type}",
            f"作者/导演: {author_director}",
            f"添加日期: {added_date}",
            f"状态: {status}",
            f"评分: {rating_str}",
            f"简评: {review}",
            f"{'=' * 40}"
        ]
        return '\n'.join(lines)


def select_media_item_by_id(all_media, prompt_message="请输入要操作的条目ID: "):
    """
    通过ID选择媒体条目
    :param all_media: 所有媒体条目列表
    :param prompt_message: 提示用户输入的消息
    :return: (找到的条目字典, 索引) 或 (None, -1) 如果未找到
    """
    if not all_media:
        print("当前没有媒体条目")
        return None, -1

    # 显示所有条目ID和标题供用户参考
    print("\n可选条目列表:")
    for idx, item in enumerate(all_media, 1):
        print(f"{idx}. {item.get('id', '?')}: {item.get('title', '无标题')}")

    while True:
        try:
            user_input = input(prompt_message).strip()
            if not user_input:
                return None, -1

            # 尝试转换为数字ID（假设ID可能是数字）
            try:
                target_id = int(user_input)
            except ValueError:
                target_id = user_input  # 保持原样用于字符串ID比较

            # 查找匹配的条目
            for idx, item in enumerate(all_media):
                if item.get('id') == target_id:
                    return item, idx

            print(f"未找到ID为 {user_input} 的条目，请重新输入")

        except KeyboardInterrupt:
            print("\n操作已取消")
            return None, -1


def get_modifications_for_item(item_dict):
    """
    获取用户对条目的修改
    :param item_dict: 原始条目字典
    :return: 包含修改的新字典（只包含用户实际修改的字段）
    """
    if not item_dict:
        return {}

    print("\n当前条目信息:")
    print(format_media_item_for_display(item_dict, "full"))

    print("\n请输入新值（直接回车保持原值）")

    # 可修改的字段及其提示信息
    modifiable_fields = {
        'status': ('状态（允许值：未开始、进行中、已完成）', str),
        'rating': ('评分(1-5)', float),
        'review': ('简评', str)
    }

    updates = {}

    for field, (prompt, field_type) in modifiable_fields.items():
        current_value = item_dict.get(field, None)
        prompt_msg = f"{prompt} [{current_value if current_value is not None else '未设置'}]: "

        while True:
            user_input = input(prompt_msg).strip()
            if not user_input:  # 用户直接回车，保持原值
                break

            try:
                if field == 'status':
                    if user_input not in STATUS_OPTIONS:
                        raise ValueError(f"无效状态！允许值为：{', '.join(STATUS_OPTIONS)}")
                    value = user_input
                elif field_type == float:
                    # 确保评分在1-5之间
                    value = float(user_input)
                    if not 1 <= value <= 5:
                        raise ValueError("评分必须在1-5之间")
                else:
                    value = field_type(user_input)

                updates[field] = value
                break

            except ValueError as e:
                print(f"输入无效: {e}. 请重新输入")
                # 针对状态错误时返回修改状态提示
                if field == 'status':
                    return {'status_error': True}  # 标记状态错误

    return updates


def modify_media_item_interaction(all_media):
    """
    交互式修改媒体条目
    :param all_media: 所有媒体条目列表
    :return: 修改后的列表（如果发生了修改），否则返回None
    """
    if not all_media:
        print("没有可修改的媒体条目")
        return None

    item, index = select_media_item_by_id(all_media)
    if not item or index == -1:
        return None

    updates = get_modifications_for_item(item)

    # 新增状态错误检查
    if 'status_error' in updates:
        print("\n状态修改失败！请输入有效的状态值。")
        return None  # 终止修改流程，返回None

    if not updates:
        print("未做任何修改")
        return None

    # 应用修改
    modified_item = all_media[index].copy()
    modified_item.update(updates)
    all_media[index] = modified_item

    print("修改成功！更新后的条目信息:")
    print(format_media_item_for_display(modified_item, "full"))

    return all_media  # 只在成功修改时返回列表